package org.springframework.security.oauth.examples.config;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.ConversionServiceFactoryBean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.http.MediaType;
import org.springframework.http.converter.BufferedImageHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.security.oauth.examples.tonr.SparklrService;
import org.springframework.security.oauth.examples.tonr.converter.AccessTokenRequestConverter;
import org.springframework.security.oauth.examples.tonr.impl.SparklrServiceImpl;
import org.springframework.security.oauth.examples.tonr.mvc.FacebookController;
import org.springframework.security.oauth.examples.tonr.mvc.SparklrController;
import org.springframework.security.oauth.examples.tonr.mvc.SparklrRedirectController;
import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;
import org.springframework.security.oauth2.common.AuthenticationScheme;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
import org.springframework.web.accept.ContentNegotiationManagerFactoryBean;
import org.springframework.web.client.RestOperations;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
@Configuration
@EnableWebMvc
@PropertySource("classpath:sparklr.properties")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
public ContentNegotiatingViewResolver contentViewResolver() throws Exception {
ContentNegotiatingViewResolver contentViewResolver = new ContentNegotiatingViewResolver();
ContentNegotiationManagerFactoryBean contentNegotiationManager = new ContentNegotiationManagerFactoryBean();
contentNegotiationManager.addMediaType("json", MediaType.APPLICATION_JSON);
contentViewResolver.setContentNegotiationManager(contentNegotiationManager.getObject());
contentViewResolver.setDefaultViews(Arrays.<View> asList(new MappingJackson2JsonView()));
return contentViewResolver;
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public SparklrController sparklrController(@Qualifier("sparklrService")
SparklrService sparklrService) {
SparklrController controller = new SparklrController();
controller.setSparklrService(sparklrService);
return controller;
}
@Bean
public SparklrRedirectController sparklrRedirectController(@Qualifier("sparklrRedirectService")
SparklrService sparklrService) {
SparklrRedirectController controller = new SparklrRedirectController();
controller.setSparklrService(sparklrService);
return controller;
}
@Bean
public FacebookController facebookController(@Qualifier("facebookRestTemplate")
RestOperations facebookRestTemplate) {
FacebookController controller = new FacebookController();
controller.setFacebookRestTemplate(facebookRestTemplate);
return controller;
}
@Bean
public SparklrServiceImpl sparklrService(@Value("${sparklrPhotoListURL}")
String sparklrPhotoListURL, @Value("${sparklrPhotoURLPattern}")
String sparklrPhotoURLPattern, @Value("${sparklrTrustedMessageURL}")
String sparklrTrustedMessageURL, @Qualifier("sparklrRestTemplate")
RestOperations sparklrRestTemplate, @Qualifier("trustedClientRestTemplate")
RestOperations trustedClientRestTemplate) {
SparklrServiceImpl sparklrService = new SparklrServiceImpl();
sparklrService.setSparklrPhotoListURL(sparklrPhotoListURL);
sparklrService.setSparklrPhotoURLPattern(sparklrPhotoURLPattern);
sparklrService.setSparklrTrustedMessageURL(sparklrTrustedMessageURL);
sparklrService.setSparklrRestTemplate(sparklrRestTemplate);
sparklrService.setTrustedClientRestTemplate(trustedClientRestTemplate);
return sparklrService;
}
@Bean
public SparklrServiceImpl sparklrRedirectService(@Value("${sparklrPhotoListURL}")
String sparklrPhotoListURL, @Value("${sparklrPhotoURLPattern}")
String sparklrPhotoURLPattern, @Value("${sparklrTrustedMessageURL}")
String sparklrTrustedMessageURL, @Qualifier("sparklrRedirectRestTemplate")
RestOperations sparklrRestTemplate, @Qualifier("trustedClientRestTemplate")
RestOperations trustedClientRestTemplate) {
SparklrServiceImpl sparklrService = new SparklrServiceImpl();
sparklrService.setSparklrPhotoListURL(sparklrPhotoListURL);
sparklrService.setSparklrPhotoURLPattern(sparklrPhotoURLPattern);
sparklrService.setSparklrTrustedMessageURL(sparklrTrustedMessageURL);
sparklrService.setSparklrRestTemplate(sparklrRestTemplate);
sparklrService.setTrustedClientRestTemplate(trustedClientRestTemplate);
return sparklrService;
}
@Bean
public ConversionServiceFactoryBean conversionService() {
ConversionServiceFactoryBean conversionService = new ConversionServiceFactoryBean();
conversionService.setConverters(Collections.singleton(new AccessTokenRequestConverter()));
return conversionService;
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new BufferedImageHttpMessageConverter());
}
@Configuration
@EnableOAuth2Client
protected static class ResourceConfiguration {
@Value("${accessTokenUri}")
private String accessTokenUri;
@Value("${userAuthorizationUri}")
private String userAuthorizationUri;
@Bean
public OAuth2ProtectedResourceDetails sparklr() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId("sparklr/tonr");
details.setClientId("tonr");
details.setClientSecret("secret");
details.setAccessTokenUri(accessTokenUri);
details.setUserAuthorizationUri(userAuthorizationUri);
details.setScope(Arrays.asList("read", "write"));
return details;
}
@Bean
public OAuth2ProtectedResourceDetails sparklrRedirect() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId("sparklr/tonr-redirect");
details.setClientId("tonr-with-redirect");
details.setClientSecret("secret");
details.setAccessTokenUri(accessTokenUri);
details.setUserAuthorizationUri(userAuthorizationUri);
details.setScope(Arrays.asList("read", "write"));
details.setUseCurrentUri(false);
return details;
}
@Bean
public OAuth2ProtectedResourceDetails facebook() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId("facebook");
details.setClientId("233668646673605");
details.setClientSecret("33b17e044ee6a4fa383f46ec6e28ea1d");
details.setAccessTokenUri("https://graph.facebook.com/oauth/access_token");
details.setUserAuthorizationUri("https://www.facebook.com/dialog/oauth");
details.setTokenName("oauth_token");
details.setAuthenticationScheme(AuthenticationScheme.query);
details.setClientAuthenticationScheme(AuthenticationScheme.form);
return details;
}
@Bean
public OAuth2ProtectedResourceDetails trusted() {
ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
details.setId("sparklr/trusted");
details.setClientId("my-client-with-registered-redirect");
details.setAccessTokenUri(accessTokenUri);
details.setScope(Arrays.asList("trust"));
return details;
}
@Bean
public OAuth2RestTemplate facebookRestTemplate(OAuth2ClientContext clientContext) {
OAuth2RestTemplate template = new OAuth2RestTemplate(facebook(), clientContext);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON,
MediaType.valueOf("text/javascript")));
template.setMessageConverters(Arrays.<HttpMessageConverter<?>> asList(converter));
return template;
}
@Bean
public OAuth2RestTemplate sparklrRestTemplate(OAuth2ClientContext clientContext) {
return new OAuth2RestTemplate(sparklr(), clientContext);
}
@Bean
public OAuth2RestTemplate sparklrRedirectRestTemplate(OAuth2ClientContext clientContext) {
return new OAuth2RestTemplate(sparklrRedirect(), clientContext);
}
@Bean
public OAuth2RestTemplate trustedClientRestTemplate() {
return new OAuth2RestTemplate(trusted(), new DefaultOAuth2ClientContext());
}
}
}